// autoSelect.js - 已改为 ES Module 格式，兼容 UniApp

// 引入 constants（确保 constants.js 也是 ES Module 格式）
import { A_CHARS, B_CHARS, C_CHARS, A_START_CHAR, B_START_CHAR, C_START_CHAR } from './constants.js';

// 匹配 Set A 字符的长度
function matchSetALength(string) {
  const regex = new RegExp(`^${A_CHARS}*`);
  return string.match(regex)[0].length;
}

// 匹配 Set B 字符的长度
function matchSetBLength(string) {
  const regex = new RegExp(`^${B_CHARS}*`);
  return string.match(regex)[0].length;
}

// 匹配 Set C 字符（连续偶数个数字）
function matchSetC(string) {
  const regex = new RegExp(`^${C_CHARS}*`);
  return string.match(regex)[0];
}

/**
 * 自动选择 CODE128A 或 CODE128B
 * @param {string} string - 剩余字符串
 * @param {boolean} isA - 当前是否使用 CODE128A
 * @returns {string} 编码后的字符串（含切换符）
 */
function autoSelectFromAB(string, isA) {
  const ranges = isA ? A_CHARS : B_CHARS;
  const cPattern = `(([0-9]{2}){2,})([^0-9]|$)`; // 至少4位数字，后接非数字
  const regex = new RegExp(`^(${ranges}+?)${cPattern}`);

  const untilC = string.match(regex);

  // 如果发现足够长的数字串，切换到 CODE128C
  if (untilC) {
    const matchedChars = untilC[1]; // A/B 字符部分
    return matchedChars + String.fromCharCode(204) + autoSelectFromC(string.substring(matchedChars.length));
  }

  // 否则尽可能使用当前字符集（A 或 B）
  const chars = string.match(new RegExp(`^${ranges}+`))[0];

  // 如果已到结尾，直接返回
  if (chars.length === string.length) {
    return string;
  }

  // 切换到另一个字符集
  const switchChar = isA ? 205 : 206; // 205=B, 206=A
  return chars + String.fromCharCode(switchChar) + autoSelectFromAB(string.substring(chars.length), !isA);
}

/**
 * 自动选择 CODE128C（数字模式）
 * @param {string} string - 剩余字符串
 * @returns {string} 编码后的字符串
 */
function autoSelectFromC(string) {
  const cMatch = matchSetC(string);
  const length = cMatch.length;

  // 如果全是数字，结束
  if (length === string.length) {
    return string;
  }

  // 截取数字部分，剩余部分判断 A/B
  string = string.substring(length);

  // 选择匹配更长的字符集（A 或 B）
  const isA = matchSetALength(string) >= matchSetBLength(string);
  return cMatch + String.fromCharCode(isA ? 206 : 205) + autoSelectFromAB(string, isA);
}

/**
 * 自动检测并选择最优的 CODE128 编码集（A/B/C）
 * @param {string} string - 输入字符串
 * @returns {string} 添加起始符和切换符后的编码字符串
 */
export default function autoSelect(string) {
  let newString;

  // 先尝试匹配 CODE128C（数字模式）
  const cLength = matchSetC(string).length;

  if (cLength >= 2) {
    // 如果开头有至少2位数字，优先使用 CODE128C
    newString = C_START_CHAR + autoSelectFromC(string);
  } else {
    // 否则比较 A 和 B 的匹配长度，选择更长的
    const isA = matchSetALength(string) > matchSetBLength(string);
    newString = (isA ? A_START_CHAR : B_START_CHAR) + autoSelectFromAB(string, isA);
  }

  // 优化：如果连续出现 205 和 206（A/B 切换），用 203（CODE128C 切换）代替
  return newString.replace(/[\xCD\xCE]([^])[\xCD\xCE]/, (match, char) => {
    return String.fromCharCode(203) + char;
  });
}